home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-05-29 | 6.6 KB | 218 lines | [TEXT/CWIE] |
- procedure InitAEUtils;
- { function GetPropertyFromContainer (prop: DescType; container: AEDesc; var result: AEDesc): OSErr;}
- { function SetPropertyFromContainer (prop: DescType; container: AEDesc; value: AEDesc): OSErr;}
- function MyOAFindProperty (desiredClass: DescType; containerToken: AEDesc; containerClass: DescType; keyForm: DescType; keyData: AEDesc; var token: AEDesc; refcon: LongInt): OSErr;
- function SetPropertyFromToken (token: AEDesc; value: AEDesc): OSErr;
- function SetPropertyRecord (token: AEDesc; value: AEDesc): OSErr;
- function GetPropertyFromToken (token: AEDesc; var result: AEDesc): OSErr;
- function GetPropertyRecord (token: AEDesc; var result: AERecord): OSErr;
-
- function StorePropertyReferenceInToken (prop: DescType; container: AEDesc; var token: AEDesc): OSErr;
- function RetrievePropertyReferenceFromToken (token: AEDesc; var prop: DescType; var container: AEDesc): OSErr;
- function ValidProperty (class, prop: DescType): boolean;
- function GetIndProperty (class: DescType; index: integer; var prop: DescType): boolean;
-
- var
- GetPropertyFromContainerProc: ProcPtr;
- SetPropertyFromContainerProc: ProcPtr;
-
- {$S Init}
- procedure InitAEUtils (GetPropertyFromContainer, SetPropertyFromContainer: ProcPtr);
- begin
- GetPropertyFromContainerProc := GetPropertyFromContainer;
- SetPropertyFromContainerProc := SetPropertyFromContainer;
- end;
- {$S}
-
- function CallGetPropertyFromContainer (prop: DescType; container: AEDesc; var result: AEDesc; p: Ptr): OSErr;
- inline
- $205F, $4E90;
-
- function CallSetPropertyFromContainer (prop: DescType; container: AEDesc; value: AEDesc; p: Ptr): OSErr;
- inline
- $205F, $4E90;
-
- function StorePropertyReferenceInToken (prop: DescType; container: AEDesc; var token: AEDesc): OSErr;
- var
- h: Handle;
- err: OSErr;
- begin
- h := nil;
- err := PtrToHand(@prop, h, SizeOf(DescType));
- if err = noErr then
- err := PtrAndHand(@container.descriptorType, h, SizeOf(DescType));
- if err = noErr then
- err := HandAndHand(container.dataHandle, h);
- if err = noErr then begin
- HLock(h);
- err := AECreateDesc(typeMyPropertyToken, h^, GetHandleSize(h), token);
- end;
- DisposeHandle(h);
- StorePropertyReferenceInToken := err;
- end;
-
- function RetrievePropertyReferenceFromToken (token: AEDesc; var prop: DescType; var container: AEDesc): OSErr;
- var
- conttype: DescType;
- err: OSErr;
- begin
- BlockMove(token.dataHandle^, @prop, SizeOf(DescType));
- BlockMove(Ptr(ord(token.dataHandle^) + SizeOf(DescType)), @conttype, SizeOf(DescType));
- HLock(token.dataHandle);
- err := AECreateDesc(conttype, Ptr(ord(token.dataHandle^) + 2 * SizeOf(DescType)), GetHandleSize(token.dataHandle) - 2 * SizeOf(DescType), container);
- HUnlock(token.dataHandle);
- if err <> noErr then begin
- AECreate(container);
- end;
- RetrievePropertyReferenceFromToken := err;
- end;
-
- type
- propertiesRecord = record
- count: integer;
- props: array[1..1000] of DescType;
- end;
- propertiesRecordPtr = ^propertiesRecord;
- propertiesRecordHandle = ^propertiesRecordPtr;
-
- function OSTypeToString (ost: OSType): Str15;
- var
- s: Str15;
- begin
- s[0] := chr(4);
- BlockMove(@ost, @s[1], 4);
- OSTypeToString := s;
- end;
-
- function GetIndProperty (class: DescType; index: integer; var prop: DescType): boolean;
- var
- h: propertiesRecordHandle;
- begin
- h := propertiesRecordHandle(GetNamedResource(myPropertiesResType, OSTypeToString(class)));
- GetIndProperty := false;
- if h <> nil then begin
- if (0 < index) & (index <= h^^.count) then begin
- prop := h^^.props[index];
- GetIndProperty := true;
- end;
- HPurge(Handle(h));
- end;
- end;
-
- function ValidProperty (class, prop: DescType): boolean;
- var
- h: propertiesRecordHandle;
- i: integer;
- begin
- h := propertiesRecordHandle(GetNamedResource(myPropertiesResType, OSTypeToString(class)));
- ValidProperty := false;
- if h <> nil then begin
- for i := 1 to h^^.count do begin
- if h^^.props[i] = prop then begin
- ValidProperty := true;
- leave;
- end;
- end;
- HPurge(Handle(h));
- end;
- end;
-
- function MyOAFindProperty (desiredClass: DescType; containerToken: AEDesc; containerClass: DescType; keyForm: DescType; keyData: AEDesc; var token: AEDesc; refcon: LongInt): OSErr;
- var
- err: OSErr;
- prop: DescType;
- begin
- if keyForm = formPropertyID then begin
- err := GetTypeFromAEDesc(keyData, prop);
- if err = noErr then begin
- if ValidProperty(containerToken.descriptorType, prop) then begin
- err := StorePropertyReferenceInToken(prop, containerToken, token);
- end
- else begin
- err := errAENoSuchObject;
- end;
- end;
- end
- else begin
- err := errAEBadKeyForm;
- end;
- MyOAFindProperty := err;
- end;
-
- function SetPropertyFromToken (token: AEDesc; value: AEDesc): OSErr;
- var
- err, junk: OSErr;
- prop: DescType;
- container: AEDesc;
- begin
- err := RetrievePropertyReferenceFromToken(token, prop, container);
- if err = noErr then begin
- err := CallSetPropertyFromContainer(prop, container, value, SetPropertyFromContainerProc);
- end;
- AEDestroy(container);
- SetPropertyFromToken := err;
- end;
-
- function SetPropertyRecord (token: AEDesc; value: AEDesc): OSErr;
- var
- index: integer;
- prop: DescType;
- element: AEDesc;
- err, junk: OSErr;
- begin
- index := 1;
- while (err = noErr) & GetIndProperty(token.descriptorType, index, prop) do begin
- err := AEGetKeyDesc(value, prop, typeWildCard, element);
- if err = noErr then begin
- err := CallSetPropertyFromContainer(prop, token, element, SetPropertyFromContainerProc);
- AEDestroy(element);
- end
- else if err = errAEDescNotFound then begin
- err := noErr;
- end;
- index := index + 1;
- end;
- SetPropertyRecord := err;
- end;
-
- function GetPropertyFromToken (token: AEDesc; var result: AEDesc): OSErr;
- var
- err, junk: OSErr;
- prop: DescType;
- container: AEDesc;
- begin
- err := RetrievePropertyReferenceFromToken(token, prop, container);
- if err = noErr then begin
- err := CallGetPropertyFromContainer(prop, container, result, GetPropertyFromContainerProc);
- end;
- AEDestroy(container);
- GetPropertyFromToken := err;
- end;
-
- function GetPropertyRecord (token: AEDesc; var result: AERecord): OSErr;
- var
- index: integer;
- prop: DescType;
- element: AEDesc;
- err, junk: OSErr;
- begin
- err := AECreateList(nil, 0, true, result);
- index := 1;
- while (err = noErr) & GetIndProperty(token.descriptorType, index, prop) do begin
- err := CallGetPropertyFromContainer(prop, token, element, GetPropertyFromContainerProc);
- if err = noErr then begin
- err := AEPutKeyDesc(result, prop, element);
- AEDestroy(element);
- end
- else if err = errAEReadDenied then begin
- err := noErr;
- end;
- index := index + 1;
- end;
- if err <> noErr then begin
- AEDestroy(result);
- end;
- GetPropertyRecord := err;
- end;
-
-